package com.letoo.sso.api.controller.internal.token;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.letoo.sso.common.domain.Result;
import com.letoo.sso.core.service.UserTokenService;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

/**
 * SSO用户服务控制器
 * 
 * @author dengjie
 *
 */
@Api(value = "用户接口token控制器")
@RestController
@RequestMapping("/int/user")
public class TokenController {

    @Autowired
    private UserTokenService userTokenService;

    /**
     * 业务接口每次都会授权校验的validateToken接口。该接口PV最大，但是校验走的缓存系统，缓存系统故障后走DB。 算法业务：
     * token由每次登陆后服务器生成,客户端需调用登陆接口验证用户名密码通过后生成token返回客户端
     * 。第一次返回给客户端的token需要密钥加密传输，密钥客户端和服务器双方约定固定：‘miAo858Miao-92RE’进行AES对称加密后的token加密串，保证返回传输不泄密，token
     * post发送给客户端，该密码保存在客户端2进制代码中相对比较安全
     * ，扛反编译android，IOS不担心反编译不允许存储在资源文件中。如果觉得还不安全还需要对URL做签名用sign在做一次校，例如:sign=md5(url+token
     * +固定字符串'mIo98aiqing'),这样不同的url它拿到加密后的token也不能使用，需要校验sign。
     * 
     * @param userId
     *            用户ID
     * 
     * @param token
     *            token
     * @param uri
     *            除开主域名地址的业务URI
     * @param sign
     *            sign。
     * @param x
     *            解决方案,认证方法：最好的方案：新增校验参数：x=AES对称加密，（当前时间格式字符），密钥采用baseconfig中的key:token_secret_key,就是：an4@lx300#$o25#$。（
     *            只有年月日时分秒的时间格式，例如：2016-03-29
     *            20:10:56），这样一般的手机和服务器的分钟应该都是一致的，很难偏差到小时，校验的时候就只校验5分钟偏差。也就是说用户在这个5分钟内是可以模拟攻击的，以外不行。这样可以减少那种损人不利己的攻击。
     * @author 邓杰
     * 
     * @return true表示鉴权成功。false表示失败
     */
    @ApiOperation(value = "验证token的服务接口", notes = "")
    @RequestMapping(value = "/token/validate", method = RequestMethod.POST, produces = "application/vnd.dragon.app-v1.0+json")
    public Result validateToken(final long userId, final String token, final String uri, final String sign,
            final String x) {
        Result result = userTokenService.validateToken(userId, token, uri, sign, x);
        return result;
    }

}
